#ifndef RGA2_WRAPPER_H
#define RGA2_WRAPPER_H

#include <opencv2/opencv.hpp>
#include <memory>
#include <string>
#include <cstdint>

// 手动定义RGA2相关的结构体和类型，避免包含有问题的系统头文件
extern "C" {
    // 基本类型定义
    typedef struct rga_buffer* rga_buffer_handle_t;
    
    // RGA缓冲区结构体
    typedef struct {
        int width;
        int height;
        int format;
        int fd;
        void* vir_addr;
        uint64_t phy_addr;
        int wstride;
        int hstride;
        int size;
    } rga_buffer_t;
    
    // RGA矩形结构体
    typedef struct {
        int xoffset;
        int yoffset;
        int width;
        int height;
    } im_rect_t;
    
    // RGA状态码
    typedef enum {
        IM_STATUS_SUCCESS = 0,
        IM_STATUS_FAILED = -1,
        IM_STATUS_INVALID_PARAM = -2,
        IM_STATUS_NOT_SUPPORT = -3,
        IM_STATUS_OUT_OF_MEMORY = -4,
        IM_STATUS_TIMEOUT = -5
    } IM_STATUS;
    
    // 格式定义
    #define RK_FORMAT_BGR_888 0x20
    #define RK_FORMAT_RGB_888 0x21
    #define RK_FORMAT_RGBA_8888 0x22
    #define RK_FORMAT_BGRA_8888 0x23
    #define RK_FORMAT_YUV420SP_NV12 0x24
    #define RK_FORMAT_YUV420SP_NV21 0x25
    
    // 函数声明（这些函数在运行时动态链接）
    IM_STATUS improcess(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat,
                       im_rect_t src_rect, im_rect_t dst_rect, im_rect_t pat_rect);
    
    // RGA2 API函数声明
    int c_RkRgaInit(void);
    int c_RkRgaDeInit(void);
}

class RGA2Wrapper {
public:
    RGA2Wrapper();
    ~RGA2Wrapper();
    
    // 初始化RGA2
    bool initialize();
    
    // 使用RGA2进行图像旋转
    bool rotateImage(const cv::Mat& input, cv::Mat& output, double angle);
    
    // 使用RGA2进行图像缩放
    bool scaleImage(const cv::Mat& input, cv::Mat& output, int target_width, int target_height);
    
    // 使用RGA2进行图像填充（将小图放在大图的左上角）
    bool padImage(const cv::Mat& input, cv::Mat& output, int target_width, int target_height);
    
    // 组合操作：旋转+填充
    bool rotateAndPad(const cv::Mat& input, cv::Mat& output, double angle, int target_width, int target_height);

private:
    bool m_initialized;
    
    // 将OpenCV Mat转换为RGA2格式
    bool convertToRGA(const cv::Mat& cv_mat, rga_buffer_t& rga_buffer);
    
    // 将RGA2格式转换为OpenCV Mat
    bool convertFromRGA(const rga_buffer_t& rga_buffer, cv::Mat& cv_mat);
    
    // 检查RGA2操作结果
    bool checkRGAStatus(int status, const std::string& operation);
};

#endif // RGA2_WRAPPER_H
